<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../react18/react.development.js"></script>
    <script src="../react18/react-dom.development.js"></script>
    <script src="../react18/babel.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/babel">
      /*
        useContext:
            *共享状态狗子 主要给后代组件共享一些数据
            *共享的过程
                1.首先在提供共享数据的组件中使用React.createContext({})方法 创建一个上下文对象
                2.上下文对象提供了一个组件<上下文对象.Provider>,这个组件的value属性的数据 会给所有组件内部的后代组件共享
                3.在接受共享数据的组件中使用useContext(xxxContext)钩子函数用来引入  某个祖辈组件的xxxContext对象共享的数据
                *如果共享的是一个函数 则可以让后代组件调用这个函数 修改共享组件提供相的数据
        */
      //首先使用React.createContext({})方法 创建一个上下文对象
      //上上下文对象提供了一个组件<上下文对象.Provider>,这个组件的value属性的数据 会给所有组件内部的后代组件共享
      const AppContext = React.createContext({});
      function Header() {
        //在接受共享数据的组件中使用useContext(xxxContext)钩子函数用来引入 某个祖辈组件的xxxContext对象共享的数据
        const { count } = React.useContext(AppContext);
        return (
          <div>
            <h2>Header:{count}</h2>
          </div>
        );
      }
      function Nav() {
        const { count } = React.useContext(AppContext);
        return (
          <div>
            <h2>Nav:{count}</h2>
          </div>
        );
      }
      function Footer() {
        const { count, setCount } = React.useContext(AppContext);
        return (
          <div>
            <h2>Footer:{count}</h2>
            <button
              onClick={() => {
                setCount((x) => x + 1);
              }}
            >
              按钮
            </button>
          </div>
        );
      }
      function App() {
        const [count, setCount] = React.useState(0);
        return (
          <div>
            <h1>App</h1>
            <AppContext.Provider value={{ count, name: "张三", setCount }}>
              <Header />
              <br />
              <Nav />
              <br />
              <Footer />
            </AppContext.Provider>
          </div>
        );
      }
      ReactDOM.createRoot(document.getElementById("app")).render(<App />);
    </script>
  </body>
</html>
